package main

import (
	"common"
	"common/configx"
	"common/consulx"
	"common/databasex"
	"common/zapx"
	"flag"
	"fmt"
	"go.uber.org/zap"
	"google.golang.org/grpc"
	"net"
	"swiper/internal/controller"
	"swiper/internal/pb"
)

import _ "github.com/mbobakov/grpc-consul-resolver"

var configPath = flag.String("config_path", "./config.yaml", "配置文件位置")

func main() {
	flag.Parse()

	if err := common.Init(
		*configPath,
		common.WithBootstrapInit(func(config configx.Config) any {
			return zapx.WithAppName(config.App.Name)
		}),
		common.WithBootstrapInit(func(config configx.Config) any { return zapx.WithDefaultLogger() }),
		common.WithBootstrapInit(func(config configx.Config) any {
			return databasex.WithMysqlDns(config.Mysql.Dns)
		}),
	); err != nil {
		panic(err)
	}

	ip, err := common.GetOutboundIP()
	if err != nil {
		zapx.Logger.Error("出口 ip 解析失败", zap.Error(err))
		return
	}
	cx := consulx.NewConsulX(
		consulx.WithRegisterServer(configx.C.App.Name, ip.String(), configx.C.Grpc.Port),
		consulx.WithDefaultHealth(),
	)

	bt := common.NewBootstrap(
		common.WithBootstrapCallFunc(cx),
	)
	if err := bt.Boot(); err != nil {
		zapx.Logger.Error("应到程序启动失败", zap.Error(err))
		return
	}

	defer func() {
		bt.Shutdown()
	}()

	if err := cx.RegisterService([]string{
		configx.C.App.Name,
	}); err != nil {
		zapx.Logger.Error("注册服务失败", zap.Error(err))
		return
	}

	//注册grpc服务
	link, err := net.Listen("tcp", fmt.Sprintf("%s:%d", ip.String(), configx.C.Grpc.Port))
	if err != nil {
		zapx.Logger.Error("启动grpc服务失败", zap.Error(err))
		return
	}
	defer link.Close()
	gs := grpc.NewServer()
	consulx.RegisterHealth(gs)
	service := new(controller.SwiperService)
	pb.RegisterSwiperServer(gs, service)
	fmt.Printf("启动grpc服务:%s\n", fmt.Sprintf("%s:%d", configx.C.Grpc.Address, configx.C.Grpc.Port))
	if err := gs.Serve(link); err != nil {
		zapx.Logger.Error("启动grpc服务失败", zap.Error(err))
		return
	}
}
